QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使う方法
コーヒーが好きな emi です。
QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使う方法を検証しました。手順を紹介します。
結論
Secrets Manager が QuickSight とは別リージョンにある場合、QuickSight が有効化されているリージョンに Secrets Manager のシークレットをレプリケーションし、そのレプリケーションされたシークレットを参照することで接続可能です。
別リージョンのシークレットを直接参照することはできないようです。
検証
以下のブログで、東京リージョンの QuickSight から別リージョンの Redshift のデータを可視化しました。
上記ブログではデータセット作成時に直接パスワードを入力したのですが、認証情報を Secrets Manager で管理するようにデータソースを変更します。
1. 失敗パターン(別リージョンのシークレットを直接参照しようとした)
QuickSight で Secrets Manager へのアクセスを許可
まず、バージニア北部リージョンの Secrets Manager を開き、シークレットの ARN をコピーします。
続いて QuckSight のアクセス許可設定をおこないます。QuickSight コンソールの右上人型アイコンをクリックし、[QuickSight を管理] - [セキュリティとアクセス許可] - [QuickSight の AWS のサービスへのアクセス] へ進み「管理」をクリックします。
Secrets Manager にチェックを入れ、「他のリージョンのシークレット」にコピーしたバージニア北部リージョンのシークレットの ARN を貼り付けます。
「シークレットを追加」で追加して「完了」をクリックします。
保存します。
データソースの変更
以下ブログの通り、認証情報を Secrets Manager で管理するには API で操作する必要があります。
AWS CLI で API 操作をするのが一番簡単なので、AWS CLI で操作していきます。
では、update-data-source コマンドでデータセットを更新します。
今回は CLI スケルトンを使います。以下のブログを参照ください。
では、以下のコマンドでスケルトンファイルのひな形を作成します。
aws quicksight update-data-source --generate-cli-skeleton > update-data-source-secrets.json
▼実行結果
[cloudshell-user@ip-10-134-29-157 ~]$ aws quicksight update-data-source --generate-cli-skeleton > update-data-source-secrets.json
[cloudshell-user@ip-10-134-29-157 ~]$
cat
コマンドで update-data-source-secrets.json
の中身を確認します。以下、ちょっと長いですが、今回必要な部分だけできるだけ抜き出して記載しています。
▼実行結果
[cloudshell-user@ip-10-134-29-157 ~]$ cat update-data-source-secrets.json
{
"AwsAccountId": "",
"DataSourceId": "",
"Name": "",
"DataSourceParameters": {
"AmazonElasticsearchParameters": {
"Domain": ""
},
:
:
},
:
:
"RedshiftParameters": {
"Host": "",
"Port": 0,
"Database": "",
"ClusterId": "",
"IAMParameters": {
"RoleArn": "",
"DatabaseUser": "",
"DatabaseGroups": [
""
],
"AutoCreateDatabaseUser": true
},
"IdentityCenterConfiguration": {
"EnableIdentityPropagation": true
}
},
:
:
"BigQueryParameters": {
"ProjectId": "",
"DataSetRegion": ""
}
},
"Credentials": {
"CredentialPair": {
"Username": "",
"Password": "",
"AlternateDataSourceParameters": [
{
"AmazonElasticsearchParameters": {
"Domain": ""
},
:
:
},
:
:
"RedshiftParameters": {
"Host": "",
"Port": 0,
"Database": "",
"ClusterId": "",
"IAMParameters": {
"RoleArn": "",
"DatabaseUser": "",
"DatabaseGroups": [
""
],
"AutoCreateDatabaseUser": true
},
"IdentityCenterConfiguration": {
"EnableIdentityPropagation": true
}
},
:
:
"BigQueryParameters": {
"ProjectId": "",
"DataSetRegion": ""
}
}
]
},
"CopySourceArn": "",
"SecretArn": ""
},
"VpcConnectionProperties": {
"VpcConnectionArn": ""
},
"SslProperties": {
"DisableSsl": true
}
}
[cloudshell-user@ip-10-134-29-157 ~]$
出力された内容を見るとデータソース ID が必要であることが分かるので、list-data-sources コマンドで確認します。
aws quicksight list-data-sources \
--aws-account-id 123456789012
▼実行結果
[cloudshell-user@ip-10-132-74-210 ~]$ aws quicksight list-data-sources \
> -- --aws-account-id 123456789012
{
"DataSources": [
{
:
:
},
{
"Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/92d8a982-3cfc-465d-b5ec-xxxxx",
"DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
"Name": "Virginia-Redshift",
"Type": "REDSHIFT",
"Status": "UPDATE_SUCCESSFUL",
"CreatedTime": "2024-11-06T14:52:52.431000+00:00",
"LastUpdatedTime": "2024-11-08T10:28:00.671000+00:00",
"DataSourceParameters": {
"RedshiftParameters": {
"Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
"Port": 5439,
"Database": "dev"
}
},
"VpcConnectionProperties": {
"VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
},
"SslProperties": {
"DisableSsl": false
}
},
:
:
{
:
:
}
],
"Status": 200,
"RequestId": "22551787-c78d-4faa-85f7-d3597b22605f"
}
[cloudshell-user@ip-10-132-74-210 ~]$
データソース ID は 92d8a982-3cfc-465d-b5ec-xxxxx
であることが分かりました。ついでに VPC connection の ARN も分かります。
update-data-source-secrets.json
を以下のように修正します。
{
"AwsAccountId": "123456789012",
"DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
"Name": "Virginia-Redshift",
"DataSourceParameters": {
"RedshiftParameters": {
"Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
"Port": 5439,
"Database": "dev"
}
},
"Credentials": {
"SecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx"
},
"VpcConnectionProperties": {
"VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
},
"SslProperties": {
"DisableSsl": false
}
}
データソースを更新します。
aws quicksight update-data-source \
--cli-input-json file://update-data-source-secrets.json
▼実行結果
[cloudshell-user@ip-10-134-29-157 ~]$ aws quicksight update-data-source \
> --cli-input-json file://update-data-source-secrets.json
An error occurred (InvalidParameterValueException) when calling the UpdateDataSource operation: The SecretArn arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx must have the same partition and region as the DataSource.
[cloudshell-user@ip-10-134-29-157 ~]$
(機械翻訳)
UpdateDataSource 操作の呼び出し時にエラーが発生しました(InvalidParameterValueException): SecretArn arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-xxxxx は、DataSource と同じパーティションおよびリージョンでなければなりません。
2. 成功パターン
以下ドキュメントを参考に、Secrets Manager のシークレットをバージニア北部リージョンから東京リージョンにレプリケーションします。
バージニア北部リージョンのシークレットを開き、レプリケーションタブで「シークレットを他のリージョンにレプリケート」をクリックします。
東京リージョンを選択し、シークレットをレプリケートします。
レプリケーションタブで、東京リージョンにレプリケートされたシークレットの ARN を確認できます。これをコピーして手元にメモしておきます。
続いて、QuickSight の管理画面で、東京リージョンにレプリケートしたシークレットへのアクセス許可を追加します。
バージニア北部リージョンのシークレットへのアクセス許可は削除します。「完了」をクリックします。
保存します。
余談ですが、ここまでの操作が完了すると、QuickSight のサービスリンクロールである「aws-quicksight-secretsmanager-role-v0」で、東京リージョンにレプリケートされたシークレットへのアクセスを許可する IAM ポリシーが自動で設定されています。
では、AWS CLI での操作に戻ります。
東京リージョンにレプリケートされたシークレットを参照するよう、以下のように update-data-source-secrets.json
を修正します。
{
"AwsAccountId": "123456789012",
"DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
"Name": "Virginia-Redshift",
"DataSourceParameters": {
"RedshiftParameters": {
"Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
"Port": 5439,
"Database": "dev"
}
},
"Credentials": {
"SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx"
},
"VpcConnectionProperties": {
"VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
},
"SslProperties": {
"DisableSsl": false
}
}
以下のコマンドでデータソースを更新します。
aws quicksight update-data-source \
--cli-input-json file://update-data-source-secrets.json
▼実行結果
[cloudshell-user@ip-10-132-74-210 ~]$ aws quicksight update-data-source \
> --cli-input-json file://update-data-source-secrets.json
{
"Status": 202,
"Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/92d8a982-3cfc-465d-b5ec-xxxxx",
"DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
"UpdateStatus": "UPDATE_IN_PROGRESS",
"RequestId": "38947b0d-21ec-4d61-8033-14509a4b4e36"
}
[cloudshell-user@ip-10-132-74-210 ~]$
今度はコマンドが成功しました。
データソースが修正できたか確認します。データソースの設定を確認するには、「新しいデータセット」をクリックします。(いつもここの導線が不思議だなあと思っています)
画面下部までスクロールすると、既存のデータソースを選択できるようになっています。変更した Redshift のデータソースを選択して、「データソースの編集」をクリックします。
「認証情報のタイプ」という項目が現れ、Secrets Manager で東京リージョンのシークレットを参照している旨が表示されました。
ちなみにここで「接続を検証」をクリックすると、「パブリック API 経由でのみサポートされます」というエラーが表示されます。右上の × をクリックして戻ります。
Secrets Manager を正常に参照できるのか、シークレットをローテーションしてみます。バージニア北部リージョンでシークレットを開き、ローテーションタブで「すぐにシークレットをローテーションさせる」をクリックします。
「ローテーションさせる」をクリックします。
ローテーションするまで数十秒 ~ 1 分程度時間がかかりました。
QuickSight に戻り、分析からデータを操作してみます。この分析のデータセットは SPICE ではなくダイレクトクエリなので、データが変更できれば正常に Redshift を参照できているものと判断します。
操作できています。
おわりに
QuickSight で別リージョンのシークレットへのアクセス許可が設定できたので、別リージョンのシークレットを直接参照できるのかと思ったのですが、そういうわけではないようでした。
どなたかのお役に立てば幸いです。
参考